<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="net.jforum.util.legacy.commons.fileupload.*" %>
<%@ page import="net.jforum.util.legacy.commons.fileupload.disk.*" %>
<%@ page import="net.jforum.util.legacy.commons.fileupload.servlet.*" %>
<%@ page import="org.json.simple.*" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="net.jforum.util.image.ImageUtils" %>
<%@ page import="net.jforum.util.preferences.SystemGlobals" %>
<%@ page import="net.jforum.util.preferences.ConfigKeys" %>
<%@ page import="net.jforum.util.MD5" %>
<%@ page import="javax.imageio.ImageIO" %>
<%

/**
 * KindEditor JSP
 * 
 * 本JSP程序是演示程序，建议不要直接在实际项目中使用。
 * 如果您确定直接使用本程序，使用之前请仔细确认相关安全设置。
 * 
 */

//文件保存目录路径
//String savePath = pageContext.getServletContext().getRealPath("/") + "attached/";
String savePath=SystemGlobals.getValue(ConfigKeys.ATTACHMENTS_STORE_DIR);
//文件保存目录URL
String saveUrl  = request.getContextPath() + "/upload/";
//定义允许上传的文件扩展名
String[] fileTypes = new String[]{"gif", "jpg", "jpeg", "png", "bmp"};
//最大文件大小
long maxSize = 1000000;

response.setContentType("text/html; charset=UTF-8");

if(!ServletFileUpload.isMultipartContent(request)){
	out.println(getError("请选择文件。"));
	return;
}
//检查目录
File uploadDir = new File(savePath);
if(!uploadDir.isDirectory()){
	out.println(getError("上传目录不存在。"));
	return;
}
//检查目录写权限
if(!uploadDir.canWrite()){
	out.println(getError("上传目录没有写权限。"));
	return;
}

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
	FileItem item = (FileItem) itr.next();
	String fileName = item.getName();
	long fileSize = item.getSize();
	if (!item.isFormField()) {
		//检查文件大小
		if(item.getSize() > maxSize){
			out.println(getError("上传文件大小超过限制。"));
			return;
		}
		//检查扩展名
		String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
		if(!Arrays.<String>asList(fileTypes).contains(fileExt)){
			out.println(getError("上传文件扩展名是不允许的扩展名。"));
			return;
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		//String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
		String newFileName=makeStoreFilename(fileName,fileExt);
		try{ 
			Calendar c = new GregorianCalendar();
			 
			int year = Calendar.getInstance().get(Calendar.YEAR);
			int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
			int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);

			 StringBuffer dir=new StringBuffer(256);
				dir.append(year).append('/').append(month).append('/').append(day).append('/');
				String dirPath=SystemGlobals.getValue(ConfigKeys.ATTACHMENTS_STORE_DIR) + "/" + dir;
			 new File(dirPath).mkdirs();
			 saveUrl+=dir;
			 File uploadedFile = new File(dirPath, newFileName);
			 item.write(uploadedFile);
			 BufferedImage bufferImage=ImageIO.read(uploadedFile);
			 if(bufferImage.getWidth()>SystemGlobals.getIntValue(ConfigKeys.ATTACHMENTS_IMAGES_MAX_THUMB_W)||
					 bufferImage.getHeight()>SystemGlobals.getIntValue(ConfigKeys.ATTACHMENTS_IMAGES_MAX_THUMB_H)){

				try {
					 
					    BufferedImage image = ImageUtils.resizeImage(ImageUtils.IMAGE_JPEG, 
						SystemGlobals.getIntValue(ConfigKeys.ATTACHMENTS_IMAGES_MAX_THUMB_W),
						SystemGlobals.getIntValue(ConfigKeys.ATTACHMENTS_IMAGES_MAX_THUMB_H),bufferImage);
					    ImageUtils.saveImage(image, dirPath+newFileName , ImageUtils.IMAGE_JPEG);
				}
				catch (Exception e) {
					out.println(getError("保存文件失败"));
				}
				
			 }
				
		}catch(Exception e){
			out.println(getError("上传文件失败。"));
			return;
		}

		JSONObject obj = new JSONObject();
		obj.put("error", 0);
		obj.put("url", saveUrl + newFileName);
		out.println(obj.toJSONString());
	}
}
%>
<%!
private String getError(String message) {
	JSONObject obj = new JSONObject();
	obj.put("error", 1);
	obj.put("message", message);
	return obj.toJSONString();
}
%>
<%! 
private String makeStoreFilename(String fileName,String fileExt)
{
	Calendar c = new GregorianCalendar();
	 
	int year = Calendar.getInstance().get(Calendar.YEAR);
	int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
	int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
	
	StringBuffer dir = new StringBuffer(256);

	
	return dir
		.append(MD5.crypt(fileName + System.currentTimeMillis()))
		.append('_')
		.append(new Random().nextInt(1000))
		.append('.')
		.append(fileExt)
		.toString();
}

%>